import pygame
import random
import math

# 初始化Pygame
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Python星河轨迹")
clock = pygame.time.Clock()

# 颜色定义（星河的金色渐变）
COLORS = [
    (255, 255, 200),  # 亮金色
    (255, 220, 100),  # 金色
    (200, 150, 50),   # 暗金色
]
BG_COLOR = (0, 0, 10)  # 深色背景


class StarParticle:
    def __init__(self):
        # 初始位置（屏幕中心）
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        # 轨迹参数（控制循环路径）
        self.angle = random.uniform(0, 2 * math.pi)  # 初始角度
        self.radius = random.randint(100, 200)       # 轨迹半径
        self.speed = random.uniform(0.01, 0.03)      # 角度变化速度
        # 粒子属性
        self.size = random.randint(1, 3)
        self.color = random.choice(COLORS)
        self.trail = []  # 拖尾缓存


    def update(self):
        # 计算新位置（基于三角函数的环形轨迹）
        self.angle += self.speed
        self.x = WIDTH // 2 + math.cos(self.angle) * self.radius
        self.y = HEIGHT // 2 + math.sin(self.angle) * self.radius
        
        # 更新拖尾（保留最近10个位置）
        self.trail.append((self.x, self.y))
        if len(self.trail) > 10:
            self.trail.pop(0)


    def draw(self, surface):
        # 绘制拖尾（透明度渐变）
        for i, (tx, ty) in enumerate(self.trail):
            alpha = 100 + i * 15  # 拖尾由暗到亮
            if alpha > 255:
                alpha = 255
            # 创建半透明表面
            trail_surf = pygame.Surface((self.size*2, self.size*2), pygame.SRCALPHA)
            pygame.draw.circle(
                trail_surf, 
                (*self.color, alpha), 
                (self.size, self.size), 
                self.size
            )
            surface.blit(trail_surf, (int(tx - self.size), int(ty - self.size)))
        
        # 绘制当前粒子
        pygame.draw.circle(
            surface, 
            self.color, 
            (int(self.x), int(self.y)), 
            self.size
        )


# 生成粒子群
particles = [StarParticle() for _ in range(150)]  # 150颗粒子


# 主循环
running = True
while running:
    # 处理退出事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 填充背景（半透明，保留拖尾残留）
    screen.fill(BG_COLOR)
    # 也可以用半透明填充增强拖尾：
    # screen.fill((0, 0, 10, 30), special_flags=pygame.BLEND_RGBA_MULT)

    # 更新并绘制所有粒子
    for p in particles:
        p.update()
        p.draw(screen)

    # 刷新画面
    pygame.display.flip()
    clock.tick(60)  # 60帧/秒

pygame.quit()